package org.mysofts.eclipseman.launch;

import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.List;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import org.mysofts.eclipseman.EclipseInstallations;
import org.mysofts.eclipseman.archives.Archive;
import org.mysofts.eclipseman.launch.util.AbstractLauncher;
import org.mysofts.eclipseman.util.MessageProvider;

/**
 * Effectue le dépaquetage d'une archive d'eclipse dans le répertoire
 * d'installation.
 * 
 * @author reda
 * 
 */
public final class EclipseUnpack extends AbstractLauncher {
	// [start] fields
	/**
	 * Nom du script.
	 */
	public static final String SCRIPT_NAME = "eclipse-duplicate";
	/**
	 * Nouveau nom de l'eclipse à créer.
	 */
	private String toCreateName;
	/**
	 * Fichier archive.
	 */
	private File archiveFile;
	/**
	 * Archive à dépaqueter.
	 */
	private Archive archive;

	// [end]

	// [start] constructeur.
	/**
	 * Constructeur.
	 * 
	 * @param args
	 *            Arguments.
	 */
	public EclipseUnpack(final String[] args) {
		super(MessageFormat.format("{0} <archive file> <eclipse à créer>",
				SCRIPT_NAME), args);
	}

	// [end]

	// [start] AbstractLauncher implementation.
	@Override
	protected void parseArguments(final String[] args) throws ParseException {
		if (args.length != 2) {
			throw new ParseException(MessageFormat.format(
					MessageProvider.get("logs").sub("launchers").sub("errors")
					.sub("argerror").value(), 2));
		}
		this.archiveFile = new File(args[0]);
		this.toCreateName = args[1];
	}

	@Override
	protected void parseOptions(final CommandLine commandLine)
			throws ParseException {
	}

	@Override
	protected void createOptions(final List<Option> optlist) {
	}

	// [end]

	// [start] méthodes
	/**
	 * Execute l'installation.
	 */
	private void execute() {
		try {
			System.out.print("Installation en cours...");
			EclipseInstallations.get().installArchive(this.archive,
					this.toCreateName);
			System.out.println(OK);
		} catch (IOException e) {
			System.err.println(NOK);
			this.functionnalError(e.getMessage());
		}
	}

	/**
	 * Vérifie l'archive passée en paramètre.
	 */
	private void checkArchive() {
		try {
			System.out.print("Vérification de l'archive...");
			this.archive = EclipseInstallations.get().loadArchive(archiveFile);
			EclipseInstallations.get().storeArchiveFile(this.archive);
			System.out.println(OK);
		} catch (Exception e) {
			System.err.println(NOK);
			this.functionnalError(e.getMessage());
		}
	}

	/**
	 * Vérifie le nouveau nom de l'eclipse à créer.
	 */
	private void checkNewName() {
		File eclipseDirToCreate = new File(
				EclipseInstallations.ECLIPSE_DIRECTORY, this.toCreateName);
		if (eclipseDirToCreate.exists()) {
			this.functionnalError(MessageFormat.format(
					MessageProvider.get("logs").sub("launchers")
							.sub("errors").sub("badnnewame").value(),
					this.toCreateName));
		}
	}

	// [end]

	// [start] main
	/**
	 * @param args
	 *            arguments.
	 */
	public static void main(final String[] args) {
		EclipseUnpack obj = new EclipseUnpack(args);
		obj.checkNewName();
		obj.checkArchive();
		obj.execute();
	}
	// [end]

}
